home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
c
/
datelib.exe
/
READDATE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-03-27
|
11KB
|
285 lines
static char readdate_prog[] = "@(#)char *readdate(int f, char *dstr) - Datum einlesen";
static char readdate_ver[] = "@(#)v1.10/kr ; 21.07.91";
/* readdate Einlesen eines Datum-String
**
** Autor Klaus Rath
**
** Deklaration char *readdate(int format, char *datestring);
**
** Compilation DOS: bcc -c readdate.c c:\usr\local\lib\libkrc_s.lib
** UNIX: cc -c readdate.c /u1/usr/lib/libkrc.a
** ( unter DOS kann die Funktion im small-Modell laufen )
**
** Übergabe Die Funktion erwartet einen Integer, der angibt in wel-
** chem Format eingelesen werden soll.
** Z.Zt. erlaubte Formate (siehe datum.h) :
** tt.mm.[jj]jj -- Deutsches Format (format: 1,2)
** mm/tt/[jj]jj -- Amerikanisches Format (format: 3,4)
** [jj]jjmmtt -- Datenbankformat DDB/4 (format: 5,6)
** tt.mm. | mm/tt -- Kurzformat deutsch/am. (format: 7,8).
** Außerdem wird ein Zeiger auf ein char-Array zur Aufnahme
** des Ergebnisses erwartet.
**
** Rückgabe (char *) auf datestring
**
** Anmerkungen Die Funktion prüft nicht die Validität des eingegebenen
** Datums - dies sollte die aufrufende Funktion selbst tun,
** bzw. den Test durch checkdate() durchführen lassen.
** Die Funktion benutzt zum Einlesen eine Funktion
** int editgetch(int form), die einen Tastendruck entsprechend
** dem übergebenen Format form bewertet. Z.Zt. sind folgende
** Formate implementiert ( s. util.h ) :
** ALL (1) - Alle Character 0 - 255
** UPPER (2) - Buchstaben werden in GROSS konvertiert
** LOWER (3) - Buchstaben werden in klein konvertiert
** NUM (4) - Zahlen, '.', ',', '+', '-'
** DATUM (5) - Zahlen, '.', '/', '-'
** ZEIT (6) - Zahlen, '.', ':'
** readdate() stellt dem Aufrufer eine Maske des angeforder-
** ten Format zur Verfügung ( z.B. __.__.__ ), wobei die
** Unterstriche durch Zahlen gefüllt werden müssen. Die
** u.U. nötigen Trennzeichen sind im Gegensatz zu den Zahlen
** nicht editierbar und werden automatisch erzeugt. Eine
** Korrektur der Zahlen ist über die BACKSPACE-Taste möglich.
** Die Eingabe von RETURN oder ESCAPE beendet die Eingabe
** immer, hinter der letzten Position genügt ein beliebige
** Tastendruck dafür - außer BACKSPACE, wg. Korrektur.
**
** Änderungen 1.00 ; 09.06.91
** - Erste Version
** 1.20 ; 21.07.91
** - Fehler im Korrekturteil beseitigt.
** - Variable int trenner = '.'||'/' eingefügt.
** - Berücksichtigung eines evtl. bereits eingegebenen
** ersten Zeichens (dazu Variable: int def_char).
** - Taste ESC (27) gibt jetzt einen NULL-Zeiger zurück
** ( tatsächlicher Abbruch !), während RETURN weiterhin
** den vorbelegten bzw. (teil-)ausgefüllten String liefert.
*/
#include <stdio.h>
#include <string.h>
#ifdef __TURBOC__
#define ANSI
#define KR_SYS
#include <stdlib.h>
#include "datum.h"
#include "util.h"
#else
#include "/u1/usr/include/datum.h"
#include "/u1/usr/include/util.h"
#endif
#ifdef ANSI
char *readdate(int format, char *dstring)
#else
char *readdate(format,dstring)
int format;
char *dstring;
#endif
{
/* Variablendefinitionen :
*/
int trennpos1 = 2, /* Positionen von Trennzeichen */
trennpos2 = 5;
int trenner; /* Trennzeichen */
int pos = 0; /* Aktuelle Position */
int maxpos = 11; /* Letztmögliche Position */
int max = 0; /* Schalter, ob am Ende */
int ch; /* Einzulesendes Zeichen */
int def_char = '_'; /* Vorbelegungszeichen */
/* Berücksichtigung eines bereits vorhandenen 1. Zeichens in dstring :
*/
if ( dstring[0] == '\0' ) {
dstring[0] = def_char;
}
else {
pos = 1;
}
/* Format überprüfen, String vorbelegen, Anzeigemaske erzeugen :
*/
switch ( format ) {
case DE_KURZ :
trenner = 46;
maxpos = 9;
dstring[trennpos1] =
dstring[trennpos2] = trenner;
printf("%c_.__.__",dstring[0]);
printf("\b\b\b\b\b\b\b");
break;
case DE_LANG :
trenner = 46;
maxpos = 11;
dstring[trennpos1] =
dstring[trennpos2] = trenner;
printf("%c_.__.____",dstring[0]);
printf("\b\b\b\b\b\b\b\b\b");
break;
case AM_KURZ :
trenner = 47;
maxpos = 9;
dstring[trennpos1] =
dstring[trennpos2] = trenner;
printf("%c_/__/__",dstring[0]);
printf("\b\b\b\b\b\b\b");
break;
case AM_LANG :
trenner = 47;
maxpos = 11;
dstring[trennpos1] =
dstring[trennpos2] = trenner;
printf("%c_/__/____",dstring[0]);
printf("\b\b\b\b\b\b\b\b\b");
break;
case DB_KURZ :
maxpos = 7;
trennpos1 =
trennpos2 = 99;
printf("%c_____",dstring[0]);
printf("\b\b\b\b\b");
break;
case DB_LANG :
maxpos = 9;
trennpos1 =
trennpos2 = 99;
printf("%c_______",dstring[0]);
printf("\b\b\b\b\b\b\b");
break;
case DE_AKTJAHR :
trenner = 46;
maxpos = 7;
dstring[trennpos1] =
dstring[trennpos2] = trenner;
printf("%c_.__.",dstring[0]);
printf("\b\b\b\b\b");
break;
case AM_AKTJAHR :
trenner = 47;
maxpos = 6;
dstring[trennpos1] = trenner;
trennpos2 = 99;
printf("%c_/__",dstring[0]);
printf("\b\b\b\b");
break;
default:
trenner = 46;
maxpos = 9;
dstring[trennpos1] =
dstring[trennpos2] = trenner;
} /* ENDE: switch(format) */
/* Evtl. noch ein BACKSPACE ausführen :
*/
if ( !pos ) {
printf("\b");
}
/* Tastendrucke abholen, bis maxpos :
*/
while ( pos < maxpos + 1 ) {
/* Falls fertig, String zurückgeben :
*/
if ( pos == maxpos ) {
dstring[pos] = '\0';
return(dstring);
}
/* An eventuellen Trennerpositionen den passenden Trenner einfügen
** und den nächsten Schleifendurchlauf abwarten :
*/
if ( pos == trennpos1 || pos == trennpos2 ) {
printf("%c",dstring[trennpos1]);
pos++;
continue;
}
/* An der vorletzten Position sind alle Tasten erlaubt, denn nur
** BACKSPACE bleibt in der Funktion :
*/
if ( pos == maxpos - 1 ) {
max = 1;
ch = editgetch(ALL);
} /* pos < maxpos -1 */
else
ch = editgetch(DATUM);
/* Auswertung der gedrückten Taste :